package net.jumpengine.bean;

import javafx.scene.canvas.GraphicsContext;
import net.jumpengine.inter.IUpdate;

/**
    * 可以修改状态的Base,由Manager.animation调用update(long)方法. <br />
    * 开发者实现invoke()修改状态,实现draw(context)绘制.
 * <br /><br />
 * <b>作者:&nbsp;</b>张天文 <br />
 * <b>日期:&nbsp;</b>2020年2月24日 下午4:35:16<br />
 * @date
 */
public abstract class ChangeBase extends Base implements IUpdate{
	protected long interval;
	protected long time=0;
	protected boolean able=true;
	
	/**
	 * 唯一构造,参数为毫秒,1秒=1000毫秒
	 * @param interval 调用的间隔时间,以毫秒为单位,now-time>interval才会修改状态
	 */
	public ChangeBase(long interval) {
		super(0, 0, 0, 0);
		this.interval=interval*1_000_000;
	}

	@Override
	public synchronized void update(long now) {
		if(!able)return;
		if(time==0) {
			time=now;
			return;
		}
		if((now-time)<interval)return;
		time=now;
		
		invoke();
	}
	
	@Override
	public void draw(GraphicsContext g) { }
    
	/**
	   * 当change(long)判断时间间隔已过,就会调用此方法.该类状态需要开发者自行维护.
	 */
	protected abstract void invoke();
	
	@Override
	public boolean isAble() {
		return able;
	}

	public void setAble(boolean able) {
		this.able = able;
		time=0;
	}
}
